今天來介紹一個刪除的小技巧
什麼是軟刪除呢?
英文叫做 「Soft Delte」,如果用意思來翻,就是柔軟的刪除,比較溫和的方式(?
但說白了就是假刪除,為什麼說是假刪除呢?
有沒有發現在一些平台裡面刪掉的資料還可以找回來,
就是因為他們都用了這個軟刪除的作法,
這是確保用戶如果想找回自己刪除的資料,
或是用戶有違反規定或有違法的舉動,但他卻把證據都銷毀,
那我們就還是可以從後台就把那些資料全部抓出來,
再舉個例子,就好像我們刪除信件或是相簿的時候,
通常東西不會直接不見,而是先進去了一個叫做垃圾桶的地方,等時間到了或是最終確認的時候才會進行移除,
所以這個功能是非常常見的,
這個做法其實很簡單,因為說白了就是讓他 看不見 而已,
delete_at
,at
通常就跟時間有關係,這是一個紀錄刪除時間的欄位在協作上,通常已經有推上遠端的東西都要再新增遷移檔,來改動其欄位
不然隊友的版本跟你的不一樣就會壞掉,而且才能夠知道是什麼時間點增加的,
進而推斷是因為什麼需求而需要使用,
那我們就可以來下指令
$ rails g migration add_delete_at_to_articles
長出 migrattion 之後要在裡面寫
class DeletedAt < ActiveRecord::Migration[6.1]
def change
# 新增欄位: 資料表名稱,欄位名稱,型態
add_column :notes, :deleted_at, :datetime
# 新增索引: 加快查詢,概念有點像寫書會加的附錄
add_index :notes, :deleted_at
end
end
然後再跑一次
$ rails db:migrate
就完成了!
第二種方式就是可以直接從我們上一個剛創好的 migration 直接進行修改
$ rails db:rollback
這指令可以讓上一個 migration 倒回還沒做 db:migrate 的時候
如果想往後倒回去多一點的話 可以在後面接 STEP=
的參數
譬如往後倒三個
$ rails db:rollback STEP=3
然後我們直接在 migration 上面做修改
class CreateArticles < ActiveRecord::Migration[7.0]
def change
create_table :articles do |t|
t.string :title
t.text :content
t.datetime :deleted_at
t.timestamps
end
add_index :articles, :deleted_at
end
end
然後在 controller 裡面也要修改
把刪除方法裡面的內容改成更新,來做到假刪除的標記
def destroy
@article.update(delete_at: Time.now)
redirect_to articles_path, notice: '刪除成功'
end
而最終呈現出來的地方也要調整,就是在列表上不能看到
意思就是只抓 delete_at
裡面是 nil
的
def index
@articles = Article.where(delete_at: nil).order(id: :desc)
end
這樣我們在刪除後這則貼文就會消失了, YA~
但這樣使用網址還是可以找的到這篇文章
所以我們可以直接再 set_article 的地方,再擋一次
def set_article
@article = Article.find_by!(id: params[:id], delete_at: nil)
end
這樣如果刪掉的話,在檯面上就真消失了
但東西卻還是存在在資料庫裡的!